package br.ita.trucocearense.cliente.core;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

import br.ita.trucocearense.cliente.core.interfaces.padraobserver.Observer;
import br.ita.trucocearense.cliente.core.interfaces.padraobserver.Subject;
import br.ita.trucocearense.cliente.core.padraoobserver.SubjectImpl;
import br.ita.trucocearense.common.core.interfaces.remote.JogoRemoto;
import br.ita.trucocearense.common.core.interfaces.remote.padraoobserver.RemoteObserver;

public class Jogo extends SubjectImpl implements RemoteObserver {
	private Mesa mesa;
	private JogoRemoto jogoRemoto;
	private Partida partida;
	
	public Jogo(Mesa mesa) {
		this.mesa = mesa;
		try {
			UnicastRemoteObject.exportObject(this);
			this.getServer().registerObserver(this);
        }
        catch(Exception re) {
            re.printStackTrace();
        }
        this.partida = new Partida(this.getServer(),this.mesa.getUserAtual());
	}


	public int[] getPlacarJogo() throws RemoteException {
		return this.getServer().getPlacarJogo(); 
	}
	

	public JogoRemoto getServer() {
		if (jogoRemoto != null)
			return jogoRemoto;
		try {			
			System.setSecurityManager(new RMISecurityManager());
			this.jogoRemoto = (JogoRemoto) Naming.lookup("rmi://" + getIPServer() + "/jogoremoto");			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		return jogoRemoto;		
	}
	
	private String getIPServer() {
		try {
			BufferedReader reader =  new BufferedReader(
					new FileReader(System.getProperty("user.dir") + File.separator + "IPServer.txt"));
			return reader.readLine();
		} catch (Exception e) {
			return "localhost";
		}		
	}

	
	@Override
	public void update(String reference) throws RemoteException {
		notifyObservers(reference);
		//System.out.println(reference + " " + this.getMesa().getUserAtual().getApelido());
		
	}

	public Mesa getMesa() {
		return mesa;
	}


	public void setMesa(Mesa mesa) {
		this.mesa = mesa;
	}

	protected void finalize() throws Throwable {
		this.getServer().removeObserver(this);
		super.finalize();
	}


	public Partida getPartida() {
		return partida;
	}
	
	public int getEquipeVencedora() throws RemoteException {
		return this.getServer().getEquipeVencedoraJogo();
		
	}



}
